home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 10, No. 12 (1989-12)(MindCraft Publishing)(Side A).zip / Nibble Volume 10, No. 12 (1989-12)(MindCraft Publishing)(Side A).po / TDIVE.BIN.S < prev    next >
Text File  |  1996-12-24  |  23KB  |  928 lines

  1. ***************************
  2. * DDIVER.BIN SOURCE CODE  *
  3. * by Robert Lavelock      *
  4. * and John Romero         *
  5. * Copyright(c) 1989       *
  6. * MindCraft Publ. Corp.   *
  7. * Merlin Pro assembler    *
  8. ***************************
  9. *
  10. * Variable block:
  11. *
  12. LEVEL     = 768          ;game level
  13. KORJ      = LEVEL+1      ;keyboard or joystick flag
  14. WAIT      = KORJ+1       ;skill level
  15. CTRLS     = WAIT+1       ;sound on/off flag
  16. DRAWX     = CTRLS+2      ;xdrawing variables
  17. DRAWY     = DRAWX+1
  18. NUM       = DRAWY+1
  19. RCODE     = NUM+1        ;return-code to Basic
  20. CHESTX    = RCODE+1      ;treasure chest coords
  21. CHESTY    = CHESTX+1
  22. MEN       = CHESTY+1     ;# of frogmen
  23. SCORE0    = MEN+1        ;score variables
  24. SCORE1    = SCORE0+1
  25. CHALIVE   = SCORE1+1     ;chest gone/still onscreen flag
  26. TONE      = CHALIVE+1
  27. LENGTH    = TONE+1
  28. KUP       = LENGTH+1
  29. KDN       = KUP+1
  30. KLF       = KDN+1
  31. KRT       = KLF+1
  32. *
  33. VERT      = 249          ;drawing variables
  34. DEPT      = VERT+1
  35. HORZ      = DEPT+1
  36. WIDT      = HORZ+1
  37. TEMP      = WIDT+1
  38. HP        = 0
  39. SH        = 254
  40. ********************************
  41. *
  42. * Vectors called from Basic:
  43. *
  44. ********************************
  45.           ORG $8000
  46. ********************************
  47. XDRAW     JMP DRAW
  48. INIT      JMP GAMESET
  49. CONT      JMP CONTINUE
  50. ERASE     JMP ERASEALL
  51. STATS     JMP PSTATS
  52. ERASTEM   JMP ERASESTEMS
  53. BSOUND    JMP VECSOUND
  54. ********************************
  55. *
  56. * Xdraw routine
  57. *
  58. ********************************
  59. DRAW      LDX NUM
  60.           LDA SHPL,X     ;point to shape address
  61.           STA SH
  62.           LDA SHPH,X
  63.           STA SH+1
  64.           LDX DRAWX
  65.           LDY DRAWY
  66. DRAW0     STX HORZ       ;xcoord
  67.           STY VERT       ;ycoord
  68.           LDY #0
  69.           LDX #0
  70.           LDA (SH),Y     ;get width of shape
  71.           STA WIDT
  72.           STA TEMP
  73.           INY
  74.           LDA (SH),Y     ;get depth of shape
  75.           STA DEPT
  76.           INC SH
  77.           INC SH
  78. DRAW1     JSR GET        ;get screen-line address
  79.           JMP DRAW2
  80. GET       LDY VERT
  81.           LDA $6000,Y    ;get line address from...
  82.           STA HP+1       ;...lookup tables
  83.           LDA $6100,Y
  84.           STA HP
  85.           LDY HORZ
  86.           RTS
  87. DRAW2     CPY #40        ;shape onscreen?
  88.           BCS DRAW3      ;<-- no
  89.           LDA (SH,X)     ;get shape byte...
  90.           EOR (HP),Y     ;...xdraw it....
  91.           STA (HP),Y     ;...store it on screen
  92. DRAW3     INC SH
  93.           INY
  94.           DEC WIDT
  95.           BNE DRAW2
  96.           LDA TEMP
  97.           STA WIDT
  98.           INC VERT
  99.           DEC DEPT
  100.           BNE DRAW1      ;finish xdrawing shape
  101.           RTS
  102. ********************************
  103. BXDRAW    JSR BSETUP     ;setup shape pointers...
  104.           JMP DRAW0      ;...and xdraw it
  105. BSETUP    STX TEMP
  106.           TAX
  107.           LDA SHPL,X
  108.           STA SH
  109.           LDA SHPH,X
  110.           STA SH+1
  111.           LDX TEMP
  112.           RTS
  113. SHPH      HEX 6363636363636300  ;<--pointers to shapes
  114. SHPL      HEX 002040587080A000
  115. ********************************
  116. *
  117. * Game setup
  118. *
  119. ********************************
  120. GAMESET
  121.           LDX #19
  122.           STX FX         ;frogman's xcoord = 19
  123.           STX BCYCLE
  124.           LDY #46
  125.           STY FY         ;ycoord = 46
  126.           LDA #0
  127.           STA FSHAPE     ;zero some variables...
  128.           STA FXV
  129.           STA SINDEX
  130.           STA FYV
  131.           STA CNTIME
  132.           STA GONECHEST
  133.           STA CHALIVE
  134.           STA BONUS
  135.           JSR BXDRAW     ;draw frogman (with shape #0)
  136.           LDA #3
  137.           STA FALIVE     ;frogman-alive = yes
  138.           STA FSPEED
  139.           STA FSCYCLE
  140.           RTS
  141. ********************************
  142. *
  143. * Start (or continue) game
  144. *
  145. ********************************
  146. CONTINUE
  147.           LDA #0
  148.           STA RCODE      ;clear return-code
  149. MAIN      JSR CONTROL    ;read keyboard
  150.           JSR JOYX       ;read joystick x-axis
  151.           JSR FMOVE      ;move frogman
  152.           JSR AMOVE      ;move sea critters
  153.           JSR GOTCHEST?  ;got the treasure chest?
  154.           JSR NEXTLEVEL? ;go to the next level?
  155.           JSR JOYY       ;read joystick y-axis
  156.           JSR FROGVSSEA  ;check frogman vs. sea critters
  157.           JSR FEXPLODE   ;frogman "explosion" routine
  158.           JSR CHESTNOISE ;noise for getting chest
  159.           JSR BLINK      ;blink the background stars
  160.           JSR MINECHECK  ;check frogman vs. mines
  161.           JSR DECBON     ;decrement the BONUS counter
  162.           LDA WAIT
  163.           JSR $FCA8      ;wait a bit
  164.           LDA RCODE      ;exit to Basic?
  165.           BEQ MAIN       ;<--no
  166.           SED            ;if so, add 1 to level counter
  167.           LDA LEVEL
  168.           CLC
  169.           ADC #1
  170.           STA LEVEL
  171.           CLD
  172.           LDX FX
  173.           LDY FY
  174.           LDA FSHAPE
  175.           JMP BXDRAW     ;...then erase frogman and RTS
  176. ********************************
  177. *
  178. * Control routine
  179. *
  180. ********************************
  181. CONTROL   LDA KORJ
  182.           CMP "J"
  183.           BEQ CONTROL0
  184.           LDA #10
  185.           JSR $FCA8
  186. CONTROL0  LDA $C000      ;get keypress
  187.           BPL CONT0      ;<--goto CONT0 if no keypress
  188.           CMP KUP        ;move up?
  189.           BNE CONT1
  190. YUP       DEC FYV        ;fyv = fyv - 1
  191.           LDA FYV
  192.           BPL CONT0
  193.           CMP #-5        ;if fyv < -5 then fyv = -5
  194.           BCS CONT0
  195.           LDA #-5
  196.           STA FYV
  197. CONT0     BIT $C010      ;clear key strobe
  198.           RTS
  199. CONT1     CMP KDN        ;move down?
  200.           BNE CONT2
  201. YDN       INC FYV        ;fyv = fyv + 1
  202.           LDA FYV
  203.           BMI CONT0
  204.           CMP #5         ;if fyv > 5 then fyv = 5
  205.           BEQ CONT0
  206.           BCC CONT0
  207.           LDA #5
  208.           STA FYV
  209.           BIT $C010
  210.           RTS
  211. CONT2     CMP KLF        ;move left?
  212.           BNE CONT3
  213.           LDA FXV        ;fxv = fxv - 1
  214.           SEC
  215.           SBC #1
  216.           STA FXV
  217.           CMP #-2        ;if fxv = -2 then fxv = -1
  218.           BNE CONT0
  219.           LDA #-1
  220.           STA FXV
  221.           BIT $C010
  222.           RTS
  223. CONT3     CMP KRT        ;move right?
  224.           BNE CONT4
  225.           LDA FXV        ;fxv = fxv + 1
  226.           CLC
  227.           ADC #1
  228.           STA FXV
  229.           CMP #2         ;if fxv = 2 then fxv = 1
  230.           BNE CONT0
  231.           LDA #1
  232.           STA FXV
  233.           BIT $C010
  234. CONT3A    RTS
  235. CONT4     CMP #147       ;CTRL-S?
  236.           BNE CONT5      ;<--no
  237.           LDA #1
  238.           SEC
  239.           SBC CTRLS
  240.           STA CTRLS      ;CTRLS = 1 - CTRLS
  241.           LDX #50
  242.           LDY #50
  243.           JSR SOUND      ;make a sound
  244.           JMP CONT0
  245. CONT5     CMP #155       ;ESC?
  246.           BNE CONT6      ;<--no
  247.           BIT $C010
  248. CONT5A    LDA $C000      ;get keypress
  249.           BPL CONT5A
  250.           CMP #155       ;another ESC?
  251.           BEQ CONT3A
  252.           JMP CONT0      ;if so,don't clear strobe
  253. CONT6     CMP #145       ;CTRL-Q?
  254.           BNE CONT3A     ;<--no
  255.           LDA #3
  256.           STA RCODE      ;return code = quit
  257.           RTS
  258. ********************************
  259. *
  260. * Move Frogman
  261. *
  262. ********************************
  263. FMOVE     LDA FALIVE     ;frogman alive?
  264.           BNE FMOVE00    ;<--yes
  265.           RTS
  266. FMOVE00   DEC FSPEED     ;can frogman move now?
  267.           BEQ FMOVE0     ;<--yes
  268.           RTS
  269. FMOVE0    LDA #3         ;reset move timer
  270.           STA FSPEED
  271.           LDX FX
  272.           LDY FY
  273.           LDA FSHAPE
  274.           JSR BXDRAW     ;erase frogman
  275. *
  276.           LDA FX         ;fx = fx + fxv
  277.           CLC
  278.           ADC FXV
  279.           STA FX
  280.           CMP #-1        ;if fx = -1 then FMOVE1
  281.           BEQ FMOVE1
  282.           CMP #39        ;if fx > 38 then fx = 38:fxv = 0
  283.           BCC FMOVE2
  284.           LDA #38
  285.           STA FX
  286.           LDA #0
  287.           STA FXV
  288.           JMP FMOVE2     ;...goto FMOVE2
  289. FMOVE1    LDA #0         ;fx = 0:fxv = 0
  290.           STA FX
  291.           STA FXV
  292. FMOVE2    LDA FY         ;fy = fy + fyv
  293.           CLC
  294.           ADC FYV
  295.           STA FY
  296.           CMP #46        ;if fy < 46 then fy = 46:fyv = 0
  297.           BCS FMOVE3
  298.           LDA #46
  299.           STA FY
  300.           LDA #0
  301.           STA FYV
  302.           JMP FMOVE4     ;...goto FMOVE4
  303. FMOVE3    CMP #137       ;if fy > 137 then fy = 137:fyv=0
  304.           BCC FMOVE4
  305.           LDA #137
  306.           STA FY
  307.           LDA #0
  308.           STA FYV
  309. FMOVE4    DEC FSCYCLE    ;if fscycle > 0 then FMOVE5
  310.           BNE FMOVE5
  311.           LDA #3         ;reset fscycle to 3
  312.           STA FSCYCLE
  313.           LDA #1         ;and switch frogman shapes
  314.           SEC
  315.           SBC FSHAPE
  316.           STA FSHAPE
  317. FMOVE5    LDA CTRLS
  318.           BEQ FMOVE6
  319.           BIT $C030
  320. FMOVE6    LDX FX
  321.           LDY FY
  322.           LDA FSHAPE
  323.           JMP BXDRAW     ;draw frogman and RTS
  324. ********************************
  325. *
  326. * Move sea critters
  327. *
  328. ********************************
  329. AMOVE     LDA #19
  330.           STA INDEX
  331. AMV1      LDX INDEX
  332.           LDA AALIVE,X   ;is critter(X) alive?
  333.           BNE AMV3       ;<--yes
  334. AMV2      DEC INDEX      ;next critter
  335.           BPL AMV1       ;until done
  336.           RTS
  337. AMV3      DEC ASPEED,X   ;cycle delay for speeds
  338.           BMI AMV3A
  339.           JMP AMV2
  340. AMV3A     LDA ASPEED1,X  ;restore original delay cntr.
  341.           STA ASPEED,X
  342.           JSR AXDRAW     ;erase critter(X)
  343.           LDX INDEX
  344.           LDA AX,X
  345.           CLC
  346.           ADC AXV,X      ;add x-velocity
  347.           STA AX,X
  348.           CMP #255       ;check screen limits
  349.           BNE AMV4
  350.           LDA #38
  351.           STA AX,X
  352.           JMP AMV5
  353. AMV4      CMP #39
  354.           BNE AMV5
  355.           LDA #0
  356.           STA AX,X
  357. AMV5      JSR AXDRAW     ;draw critter(X)
  358.           LDX INDEX
  359.           LDA AX,X
  360.           TAX
  361.           INX
  362.           LDY #4
  363.           JSR SOUND      ;make a noise
  364.           JMP AMV2       ;next critter!
  365. ********************************
  366. AXDRAW    LDY AY,X       ;xdrawing routine
  367.           LDA ASHAPE,X
  368.           PHA
  369.           LDA AX,X
  370.           TAX
  371.           PLA
  372.           JMP BXDRAW
  373. ********************************
  374. *
  375. * Check to see if Frogman got
  376. * the treasure chest. Erase if so.
  377. *
  378. ********************************
  379. GOTCHEST?
  380.           LDA FALIVE     ;if frogman alive?
  381.           BNE GOT0       ;<--yes
  382.           RTS
  383. GOT0      LDA GONECHEST  ;did he get the chest yet?
  384.           BEQ GOT        ;<--no
  385.           RTS
  386. GOT       LDA FX         ;check x-coordinates
  387.           SEC
  388.           SBC CHESTX
  389.           BEQ GOT1       ;<--right on target
  390.           CMP #1
  391.           BEQ GOT1       ;<--little to the left
  392.           CMP #-1
  393.           BEQ GOT1       ;<--little to the right
  394.           RTS
  395. GOT1      LDA FY         ;if fy>125 then gotchest!
  396.           CMP #125
  397.           BCS GOT2
  398.           RTS
  399. GOT2      LDX CHESTX
  400.           LDY CHESTY
  401.           LDA #2
  402.           JSR BXDRAW     ;erase chest
  403.           LDA #1
  404.           STA GONECHEST  ;<--chest is gone
  405.           STA CHALIVE    ;<--chest is "dead"
  406.           LDA #9
  407.           STA CNTIME     ;make a noise
  408.           SED
  409.           LDA LEVEL
  410.           STA TEMP
  411. GOT2A     LDA SCORE0     ;add 10*level to score
  412.           CLC
  413.           ADC #$10
  414.           STA SCORE0
  415.           BCC GOT3
  416.           LDA SCORE1
  417.           CLC
  418.           ADC #1
  419.           STA SCORE1
  420. GOT3      LDA TEMP
  421.           SEC
  422.           SBC #1
  423.           STA TEMP
  424.           BNE GOT2A
  425.           CLD
  426.           LDA #$50       ;set BONUS counter to 50
  427.           STA BONUS
  428.           JMP PSTATS     ;and print new score
  429. ********************************
  430. *
  431. * Check to see if Frogman swam
  432. * back up to the ship with the
  433. * treasure chest.
  434. *
  435. ********************************
  436. NEXTLEVEL?
  437.           LDA GONECHEST  ;is the chest gone?
  438.           BNE NEXT1      ;<--yes
  439.           RTS
  440. NEXT1     LDA FX         ;is frogman directly under ship?
  441.           CMP #19
  442.           BEQ NEXT2
  443.           RTS
  444. NEXT2     LDA FY
  445.           CMP #46
  446.           BEQ NEXT3      ;<--yes
  447.           RTS
  448. NEXT3     LDA #1         ;return code #1 = next level!
  449.           STA RCODE
  450.           SED
  451.           LDA SCORE0
  452.           CLC
  453.           ADC BONUS      ;add BONUS to score
  454.           STA SCORE0
  455.           BCC NEXT4
  456.           LDA SCORE1
  457.           CLC
  458.           ADC #1
  459.           STA SCORE1
  460. NEXT4     CLD
  461.           JMP PSTATS     ;and print it
  462. ********************************
  463. *
  464. * Count down the BONUS points!
  465. *
  466. ********************************
  467. DECBON    LDA BONUS      ;count down BONUS points?
  468.           BNE DECBON1    ;<--yes
  469.           RTS
  470. DECBON1   LDA FSPEED     ;can frogman move? (be fair now)
  471.           CMP #1
  472.           BEQ DECBON2    ;<--yes
  473.           RTS
  474. DECBON2   SED            ;subtract 1 from BONUS
  475.           LDA BONUS
  476.           SEC
  477.           SBC #1
  478.           STA BONUS
  479.           CLD
  480.           RTS
  481. ********************************
  482. *
  483. * Erase all sea critters
  484. *
  485. ********************************
  486. ERASEALL
  487.           LDA #19
  488.           STA INDEX      ;all 20 possible critters
  489. ERASE1    LDX INDEX
  490.           LDA AALIVE,X   ;is critter(X) alive?
  491.           BNE ERASE3     ;<--yes
  492. ERASE2    DEC INDEX      ;next critter
  493.           BPL ERASE1
  494.           JMP ERASE4     ;GOTO ERASE4
  495. ERASE3    JSR AXDRAW     ;erase critter(X)
  496.           JMP ERASE2
  497. *
  498. ERASE4    LDA #9
  499.           STA INDEX      ;erase all 10 possible mines
  500. ERASE5    LDX INDEX
  501.           LDA MALIVE,X   ;mine(X) alive?
  502.           BNE ERASE7     ;<--yes
  503. ERASE6    DEC INDEX      ;next mine
  504.           BPL ERASE5
  505.           RTS
  506. ERASE7    LDY MINEY,X
  507.           LDA MINEX,X
  508.           TAX
  509.           LDA #6
  510.           JSR BXDRAW     ;erase mine(X)
  511.           JMP ERASE6
  512. ********************************
  513. *
  514. * Erase mine stems
  515. *
  516. ********************************
  517. ERASESTEMS
  518.           LDA #9
  519.           STA INDEX      ;all 10 possible stems,too
  520. ESTEM1    LDX INDEX
  521.           LDA MALIVE,X
  522.           BNE ESTEM3
  523. ESTEM2    DEC INDEX
  524.           BPL ESTEM1
  525.           RTS
  526. ESTEM3    LDX #0         ;HCOLOR=0
  527.           JSR $F6F0
  528.           LDX INDEX
  529.           LDY STEMY,X
  530.           LDA STEMX,X
  531.           TAX
  532.           TYA
  533.           LDY #0
  534.           JSR $F457      ;HPLOT stemx,stemy
  535.           LDX INDEX
  536.           LDA STEMX,X
  537.           LDY #144
  538.           LDX #0
  539.           JSR $F53A      ;HPLOT TO stemx,144
  540.           JMP ESTEM2
  541. ********************************
  542. *
  543. * Read joystick X axis
  544. *
  545. ********************************
  546. JOYX      LDA KORJ       ;joystick mode?
  547.           CMP #"J"
  548.           BEQ JOYX1      ;<--yes
  549.           RTS
  550. JOYX1     LDX #0         ;read paddle 0
  551.           JSR $FB1E
  552.           TYA
  553.           CMP #70        ;if padx<70 then fxv=-1
  554.           BCS JOYX2
  555.           LDA #-1
  556.           STA FXV
  557.           JMP PAUSE
  558. JOYX2     CMP #180       ;if padx>180 then fxv=1
  559.           BCC JOYX3
  560.           LDA #1
  561.           STA FXV
  562.           RTS
  563. JOYX3     LDA #0         ;if padx>69 and padx<181,fxv=0
  564.           STA FXV
  565. ********************************
  566. PAUSE     LDA #50
  567.           JMP $FCA8
  568. ********************************
  569. *
  570. * Read joystick Y axis
  571. *
  572. ********************************
  573. JOYY      LDA KORJ       ;same as x-axis
  574.           CMP #"J"
  575.           BEQ JOYY1
  576.           RTS
  577. JOYY1     LDX #1         ;read paddle 1
  578.           JSR $FB1E
  579.           TYA
  580.           CMP #70
  581.           BCS JOYY2
  582.           JSR PAUSE
  583.           JMP YUP
  584. JOYY2     CMP #180
  585.           BCC JOYY3
  586.           JMP YDN
  587. JOYY3     LDA #0
  588.           STA FYV
  589.           JMP PAUSE
  590. ********************************
  591. *
  592. * Check Frogman vs Sea Critters
  593. *
  594. ********************************
  595. FROGVSSEA
  596.           LDA FALIVE     ;frogman alive?
  597.           BNE FS0        ;<--yes
  598.           RTS
  599. FS0       LDA #19        ;check all 20 possible critters
  600.           STA INDEX
  601. FS1       LDX INDEX
  602.           LDA AALIVE,X   ;critter(X) alive?
  603.           BNE FS3        ;<--yes
  604. FS2       DEC INDEX
  605.           BPL FS1
  606.           RTS
  607. FS3       LDA FX         ;if fx-ax(X) >-2 and < 2, FS4
  608.           SEC
  609.           SBC AX,X
  610.           CMP #-2
  611.           BCS FS4
  612.           CMP #2
  613.           BCC FS4
  614.           JMP FS2
  615. FS4       LDA FY         ;if fy-ay(X) >-10 and <5, FS5
  616.           SEC
  617.           SBC AY,X
  618.           CMP #-10
  619.           BCS FS5
  620.           CMP #5
  621.           BCC FS5
  622.           JMP FS2
  623. FS5       LDA #0
  624.           STA FALIVE     ;frogman is "dead"
  625.           LDA #20
  626.           STA XTIME      ;explode 20 cycles
  627.           LDA AXV,X
  628.           STA EXXV
  629.           LDA #0
  630.           STA EXYV       ;set explosion velocities
  631.           RTS
  632. ********************************
  633. *
  634. * Frogman's death scene
  635. *
  636. ********************************
  637. FEXPLODE
  638.           LDA FALIVE     ;frogman alive?
  639.           BEQ FEX        ;<--no
  640.           RTS
  641. FEX       BIT -16302     ;full-screen
  642.           BIT -16299     ;hires page 2
  643.           JSR XNOISE     ;make a noise
  644.           BIT -16300     ;hires page 1
  645.           JSR XNOISE     ;make a noise
  646.           LDX FX
  647.           LDY FY
  648.           LDA FSHAPE
  649.           JSR BXDRAW     ;erase frogman
  650.           LDA FX
  651.           CLC
  652.           ADC EXXV       ;move frogman according to...
  653.           STA FX
  654.           LDA FY
  655.           CLC
  656.           ADC EXYV       ;explosion velocities
  657.           STA FY
  658.           LDX FX
  659.           LDY FY
  660.           LDA FSHAPE
  661.           JSR BXDRAW     ;draw frogman
  662.           DEC XTIME
  663.           BEQ FEX1
  664.           BIT -16301     ;split text/graphics mode
  665.           RTS
  666. FEX1      LDA #1         ;frogman = alive
  667.           STA FALIVE
  668.           LDA #0
  669.           STA FXV
  670.           STA FYV
  671.           LDX FX
  672.           LDY FY
  673.           LDA FSHAPE
  674.           JSR BXDRAW     ;erase him
  675.           LDA GONECHEST  ;if chest is still there, put
  676.           BNE FEX2       ;...frogman at top of water
  677.           LDY #46
  678.           JMP FEX3
  679. FEX2      LDY #136       ;if chest is gone, put him on
  680. FEX3      STY FY         ;...the bottom of the water
  681.           LDA FSHAPE
  682.           BIT -16301     ;text/graphics mode
  683.           LDX FX
  684.           JSR BXDRAW     ;draw frogman
  685.           SED
  686.           LDA MEN
  687.           SEC
  688.           SBC #1
  689.           STA MEN        ;FROGMEN=FROGMEN - 1
  690.           CLD
  691.           PHP            ;save processor status
  692.           JSR PSTATS     ;print game status
  693.           PLP            ;get processor status
  694.           BCS FEX4       ;if FROGMEN > 0 then all is o.k.
  695.           LDA #2
  696.           STA RCODE      ;...else GAME OVER! return code
  697. FEX4      RTS
  698. ********************************
  699. *
  700. * Print statistics
  701. *
  702. ********************************
  703. PSTATS    LDY #20
  704.           LDX #8
  705.           JSR TABS       ;htab 9:vtab 21
  706.           LDA MEN
  707.           JSR $FDDA      ;print MEN
  708.           LDY #20
  709.           LDX #25
  710.           JSR TABS       ;htab 26:vtab 21
  711.           LDA LEVEL
  712.           JSR $FDDA      ;print LEVEL
  713.           LDY #21
  714.           LDX #6
  715.           JSR TABS       ;htab 7:vtab 22
  716.           LDA SCORE1
  717.           JSR $FDDA
  718.           LDA SCORE0
  719.           JMP $FDDA      ;print SCORE0,1
  720. ********************************
  721. TABS      STX 36
  722.           STY 37
  723.           JMP $FC22      ;validate tab changes
  724. ********************************
  725. *
  726. * Got-Chest noise
  727. *
  728. ********************************
  729. CHESTNOISE
  730.           LDA CNTIME     ;make a chest-noise?
  731.           BNE CHN        ;<--yes
  732.           RTS
  733. CHN       LDY CNTIME     ;get pointer
  734.           LDX CNTONE-1,Y ;get note
  735.           LDA CNLENG-1,Y ;get length of note
  736.           TAY
  737.           DEC CNTIME
  738.           JMP SOUND      ;make a sound
  739. CNTONE    DFB 10,30,50,60,70,60,50,30,10
  740. CNLENG    DFB 50,40,30,20,10,20,30,40,50
  741. ********************************
  742. *
  743. * Sound routine
  744. *
  745. ********************************
  746. VECSOUND
  747.           LDX TONE       ;for calling from Basic
  748.           LDY LENGTH
  749. SOUND
  750.           LDA CTRLS      ;sound off?
  751.           BEQ SOUND3     ;<--yes
  752.           STX TEMP       ;temp=x
  753. SOUND1    LDX TEMP       ;x=temp
  754. SOUND2    DEX            ;x=x-1
  755.           BNE SOUND2     ;if x>0 then SOUND2
  756.           BIT $C030      ;click speaker
  757.           DEY            ;length=length - 1
  758.           BNE SOUND1     ;if length>0 then SOUND1
  759. SOUND3    RTS
  760. ********************************
  761. *
  762. * Blink the twilight stars...
  763. *
  764. ********************************
  765. BLINK     DEC BCYCLE     ;o.k. to blink next star?
  766.           BEQ BLINK0     ;<--yes
  767.           RTS
  768. BLINK0    LDA #5         ;keep blink for 5 cycles
  769.           STA BCYCLE
  770.           LDA #32
  771.           STA 230        ;set hires page 1
  772.           LDX #0
  773.           JSR $F6F0      ;HCOLOR = 0
  774.           LDY SINDEX
  775.           LDX STARX,Y
  776.           LDA STARY,Y
  777.           LDY #0
  778.           JSR $F457      ;HPLOT starx(Y),stary(Y)
  779.           LDX #3
  780.           JSR $F6F0      ;HCOLOR = 3
  781.           INC SINDEX     ;next star
  782.           LDY SINDEX
  783.           CPY #50        ;if SINDEX=50 then SINDEX=0
  784.           BCC BLINK1
  785.           LDY #0
  786.           STY SINDEX
  787. BLINK1    LDX STARX,Y
  788.           LDA STARY,Y
  789.           LDY #0
  790.           JMP $F457      ;HPLOT starx(Y),stary(Y)
  791. ********************************
  792. *
  793. * Death noise
  794. *
  795. ********************************
  796. XNOISE
  797.           LDA CTRLS      ;sound on?
  798.           BEQ :LOOP4     ;<--no
  799.           LDA #-10
  800.           STA TEMP
  801. :LOOP     LDX TEMP
  802.           LDA $F800,X    ;get tones from somewhere...
  803.           LDY #4
  804. :LOOP1    TAX
  805. :LOOP2    DEX
  806.           BNE :LOOP2
  807.           BIT $C030      ;and make quick sound-bursts
  808.           DEY            ;...for explosion
  809.           BNE :LOOP1
  810.           INC TEMP
  811.           BNE :LOOP
  812. :LOOP3    RTS
  813. :LOOP4    LDA #75        ;if sound off, wait a bit so
  814.           JMP $FCA8      ;...player can see screen-mess!
  815. ********************************
  816. *
  817. * Check Frogman vs. Mines
  818. *
  819. ********************************
  820. MINECHECK
  821.           LDA FALIVE     ;is frogman alive?
  822.           BNE MINE0      ;<--yes
  823.           RTS
  824. MINE0     LDA #9
  825.           STA INDEX      ;check all 10 possible mines
  826. MINE1     LDX INDEX
  827.           LDA MALIVE,X
  828.           BNE MINE3
  829. MINE2     DEC INDEX
  830.           BPL MINE1
  831.           RTS
  832. MINE3     LDA FX
  833.           SEC
  834.           SBC MINEX,X    ;check FX vs MINEX(X)
  835.           BEQ MINE4
  836.           CMP #1
  837.           BEQ MINE4
  838.           CMP #-1
  839.           BNE MINE2
  840. MINE4     LDA FY
  841.           SEC
  842.           SBC MINEY,X    ;check FY vs MINEY(X)
  843.           BEQ MINE5
  844.           CMP #-10
  845.           BCS MINE5
  846.           CMP #7
  847.           BCS MINE2
  848. MINE5     LDA #0
  849.           STA FALIVE     ;frogman = "dead"
  850.           STA MALIVE,X   ;mine = "dead" also
  851.           LDA #0
  852.           STA EXXV
  853.           LDA #-4
  854.           STA EXYV       ;throw frogman up!
  855.           LDA #20
  856.           STA XTIME      ;explode for 20 cycles
  857. ********************************
  858.           STX INDEX1
  859.           LDX FX
  860.           LDY FY
  861.           LDA FSHAPE
  862.           JSR BXDRAW
  863.           JSR ERASEALL   ;erase critters & mines
  864.           LDX #0
  865.           JSR $F6F0
  866.           LDX INDEX1
  867.           LDY STEMY,X
  868.           LDA STEMX,X
  869.           TAX
  870.           TYA
  871.           LDY #0
  872.           JSR $F457
  873.           LDX INDEX1
  874.           LDA STEMX,X
  875.           LDX #0
  876.           LDY #144
  877.           JSR $F53A      ;erase mine stem(X)
  878.           LDX INDEX1
  879.           LDY MINEY,X
  880.           LDA MINEX,X
  881.           TAX
  882.           LDA #6
  883.           JSR BXDRAW     ;erase mine(X)
  884.           LDX FX
  885.           LDY FY
  886.           LDA FSHAPE
  887.           JSR BXDRAW
  888.           JMP ERASEALL   ;redraw critters & mines
  889. *******************************
  890. *
  891. * Main variables start at $8A00
  892. *
  893.           TR ON
  894.           ORG $8A00
  895. AALIVE    DS 20
  896. AX        DS 20
  897. AY        DS 20
  898. AXV       DS 20
  899. ASHAPE    DS 20
  900. ASPEED    DS 20
  901. ASPEED1   DS 20
  902. FX        DS 1
  903. FY        DS 1
  904. FXV       DS 1
  905. FYV       DS 1
  906. FSHAPE    DS 1
  907. FSCYCLE   DS 1
  908. FSPEED    DS 1
  909. INDEX     DS 1
  910. GONECHEST DS 1
  911. FALIVE    DS 1
  912. XTIME     DS 2
  913. CNTIME    DS 1
  914. STARX     DS 50
  915. STARY     DS 50
  916. SINDEX    DS 1
  917. BCYCLE    DS 1
  918. MINEX     DS 10
  919. MINEY     DS 10
  920. MALIVE    DS 10
  921. EXXV      DS 1
  922. EXYV      DS 1
  923. INDEX1    DS 1
  924. STEMX     DS 10
  925. STEMY     DS 10
  926. BONUS     DS 1
  927.           LST OFF
  928.